package com.zw.a.basic.a15.demo03_reflect;

import java.lang.reflect.Constructor;

//案例: 反射获取构造方法并使用.
/*
    Constructor单词的意思就是: 构造方法, 构造器.

    反射获取构造方法涉及到的API, 以下全部都是Class类中的方法
        public Constructor getConstructor(Class... params);     根据传入的参数类型, 获取其对应的构造方法对象(即: 构造器对象), 只能获取公共的构造方法
        public Constructor[] getConstructors();                  获取指定类中所有的构造方法对象(即: 构造器对象), 只能获取公共的构造方法

        public Constructor getDeclaredConstructor(Class... params);  根据传入的参数类型, 获取其对应的构造方法对象(包括私有)
            这个构造方法要掌握

        public Constructor[] getDeclaredConstructors();               获取指定类中所有的构造方法对象(包括私有)

    获取构造方法的目的:
        通过反射的形式, 创建该类的对象.
 */
public class Demo02 {
    public static void main(String[] args) throws Exception {
        //需求1: 获取公共的 全参构造.
        //method01();

        //需求2: 获取公共的 所有构造方法.
        //method02();

        //需求3: 获取私有的 带String参数的构造方法.
        method03();

        //需求4: 获取所有的构造方法, 包括私有.
        //1. 获取该类的字节码文件对象.
        //method04();
    }

    public static void method04() throws ClassNotFoundException {
        Class<?> clazz = Class.forName("com.itheima.pojo.Student");
        //2. 获取所有的构造方法, 包括私有.
        Constructor<?>[] cons = clazz.getDeclaredConstructors();
        //3. 打印.
        for (Constructor<?> con : cons) {
            System.out.println(con);
        }
    }

    public static void method03() throws ClassNotFoundException, NoSuchMethodException {
        //1. 获取该类的字节码文件对象.
        Class<?> clazz = Class.forName("com.itheima.pojo.Student");
        //2. 获取私有的 带String参数的构造方法.
        Constructor<?> con = clazz.getDeclaredConstructor(String.class, int.class);
        //3. 打印.
        System.out.println(con);
    }

    public static void method02() throws ClassNotFoundException {
        //1. 获取该类的字节码文件对象.
        Class<?> clazz = Class.forName("com.itheima.pojo.Student");
        //2. 获取公共的 所有构造方法..
        Constructor<?>[] cons = clazz.getConstructors();
        //3. 打印.
        for (Constructor<?> con : cons) {
            System.out.println(con);
        }
    }

    public static void method01() throws ClassNotFoundException, NoSuchMethodException {
        //1. 获取该类的字节码文件对象.
        Class<?> clazz = Class.forName("com.itheima.pojo.Student");
        //2. 获取指定的构造器对象.
        Constructor<?> con = clazz.getConstructor(String.class, int.class);
        //3. 打印.
        System.out.println(con);
    }
}
